Simple Injector


In [83]:
"a b c".split()
d = {'a': 5, 'b': 6}
def p_d(*args):
    print args
p_d(*d)

a = [1,2,3]
b = [3,4]
a.extend(b)
a


('a', 'b')
Out[83]:
[1, 2, 3, 3, 4]

In [33]:
from functools import partial
        
app = {
    'a': 5,
    'b': True
}

def inject(dependencies=None):        
    def injection(F):
        kwargs = dict([(item, app[item]) for item in dependencies]) 
        
        def injected(x, a=None, b=None):
            if a is not None:
                kwargs.update(a=a)
            if b is not None:
                kwargs.update(b=b)
        
            return F(x, **kwargs)
        
        return injected    
    return injection

@inject(dependencies=('a','b'))
def func(x, a=None, b=None):
    print "func called with {0},{1}".format(a, b)
    
func("zzz")


func called with 5,True

Object bound injector


In [88]:
from functools import wraps
class App(object):
    def __init__(self):
        self.a=55
        self.b=False
        self.c="!!!"
        
    def inject(self, *names_to_inject):
        def _inject(func):
            @wraps(func)
            def injected(*args, **kwargs):
                to_inject = dict([(name, getattr(self, name)) 
                                  for name in names_to_inject])
                
                to_inject.update(kwargs)
                kwargs = to_inject
                return func(**kwargs)
            return injected
        return _inject
        

        
app = App()

@app.inject('a', 'b')
def log_a_b(a=None, b=None, c=None):
    print "a={0}, b={1}, c={2}".format(a, b, c)
    
print log_a_b.__name__
log_a_b(a=7, c="zzz")


log_a_b
a=7, b=False, c=zzz

Function Params Introspection

Smart Injector